package tpv;

import java.util.ArrayList;

/**
 * Objeto venta del tpv
 * @author paco
 */
public class Venta implements Cloneable
{
    private boolean empleado;
    private boolean tarjetaFidelidad;
    private ArrayList<LinVenta> lineas;
    private Regla descuento;
    private double impuestos;
    private double descuentoAcumulado;
    private Impuestos calcularImpuestos;
    private Fecha fecha;

    /**
     * Constructor por defecto
     */
    public Venta()
    {
	lineas = new ArrayList<LinVenta>();
	tarjetaFidelidad = false;
	empleado = false;
    }

    /**
     * Constructor sobrecargado
     * @param empleado Indica si es empleado o no el que realiza la compra
     * @param fidelidad Indica si el cliente tiene tarjeta de fidelidad
     */
    public Venta(boolean empleado, boolean fidelidad, Fecha fecha)
    {
		lineas = new ArrayList<LinVenta>();
	this.empleado = empleado;
	this.tarjetaFidelidad = fidelidad;
	this.fecha = fecha;
    }

    public Fecha getFecha()
    {
	return this.fecha;
    }

    /**
     * Deshace la última linea de venta añadida
     */
    public void deshacerLinVenta()
    {
	if (lineas != null && !lineas.isEmpty())
	{
	    lineas.remove(lineas.size() - 1);
	}
    }

    public boolean hasTarjeta()
    {
	return tarjetaFidelidad;
    }

    public boolean isEmpleado()
    {
	return empleado;
    }

    public Iterable<LinVenta> getLineas()
    {
	return lineas;
    }

    /**
     * Aplica los impuestos aplicables a una venta
     */
    public void aplicarImpuestos()
    {
	if (calcularImpuestos != null)
	{
	    impuestos = calcularImpuestos.calcularImpuestos(this);
	}
    }

    /**
     * Aplica los descuentos posibles a una venta
     */
    public void aplicarDescuentos()
    {
	if (descuento != null)
	{
	    descuentoAcumulado = descuento.aplicar(this);
	}
    }

    /**
     * Aplica los descuentos que se puedan aplicar y finaliza la venta
     * @return Venta con los descuentos aplicados
     */
    public Venta cerrarVenta()
    {
	this.aplicarDescuentos();
	this.aplicarImpuestos();
	return this;
    }

    /**
     * Añade una nueva linea de ventas a la venta
     * @param linea Linea de venta que se va a añadir
     */
    public void anyadirLinVenta(LinVenta linea)
    {
	if (lineas == null)
	{
	    lineas = new ArrayList<LinVenta>();
	}
	lineas.add(linea);
    }

    /**
     * Añade una nueva regla de descuento
     * @param r Regla que se va a añadir
     */
    public void setRegla(Regla r)
    {
	descuento = r;
    }

    public Double getImpuestos()
    {
	return impuestos;
    }

    public void setImpuestos(double impuestos)
    {
	this.impuestos = impuestos;
    }

    public void setCalculadoraImpuestos(Impuestos calcularImpuestos)
    {
	this.calcularImpuestos = calcularImpuestos;
    }

}
